package com.king.nio.filechannel;

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * MappedByteBuffer
 * 说明：可以让文件直接在内存（堆外内存）修改，操作系统不需要拷贝一次
 *
 * @author king
 * @date 2020/12/27 15:07
 */
public class MappedBufferDemo {
    public static void main(String[] args) throws Exception {
        RandomAccessFile randomAccessFile = new RandomAccessFile("e:/NioFileChannel01.txt", "rw");
        FileChannel fileInputStreamChannel = randomAccessFile.getChannel();

        /**
         * 参数1：使用的模式
         * 参数2：修改的起始位置
         * 参数3：可供修改的范围，即映射到内存的大小，文件的多少个字节映射到内存提供修改
         * 实际类型：DirectByteBuffer
         */
        MappedByteBuffer mappedByteBuffer = fileInputStreamChannel.map(FileChannel.MapMode.READ_WRITE, 0, 5);

        mappedByteBuffer.put(0, (byte) '1');
        mappedByteBuffer.put(3, (byte) '4');
        // IndexOutOfBoundsException 范围是大小，不是指索引位置，超出大小则抛异常
//        mappedByteBuffer.put(5, (byte) '5');

        fileInputStreamChannel.close();
        randomAccessFile.close();
    }
}
